﻿using BookFly.Models;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using System.Threading.Tasks;

namespace BookFly.Services
{
    class FlightInformationService
    {
        public Dictionary<string, string> CityAirportCommonCodes { get; set; } = new Dictionary<string, string>
        {
            { "北京", "BJS" },
            { "上海", "SHA" },
            { "广州", "CAN" },
            { "深圳", "SZX" },
            { "成都", "CTU" },
            { "杭州", "HGH" },
            { "武汉", "WUH" },
            { "西安", "SIA" },
            { "重庆", "CKG" },
            { "青岛", "TAO" },
            { "长沙", "CSX" },
            { "南京", "NKG" },
            { "厦门", "XMN" },
            { "昆明", "KMG" },
            { "大连", "DLC" },
            { "天津", "TSN" },
            { "三亚", "SYX" }
        };

        public Dictionary<string, string> CityAirportForeignCodes { get; set; } = new Dictionary<string, string>
        {
            { "札幌", "SPK" },
            { "东京", "TYO" },
            { "大阪", "OSA" },
            { "名古屋", "NGO" },
            { "冲绳", "OKA" },
            { "福冈", "FUK" },
            { "首尔", "SEL" },
            { "釜山", "PUS" },
            { "济州", "CJU" },
            { "河内", "HAN" },
            { "胡志明", "SGN" },
            { "新加坡", "SIN" },
            { "吉隆坡", "KUL" },
            { "槟城", "PEN" },
            { "苏梅岛", "USM" },
            { "清迈", "CNX" },
            { "曼谷", "BKK" },
            { "普吉岛", "NKG" },
            { "巴厘岛", "DPS" },
            { "金边", "PNH" },
            { "雅加达", "JKT" },
            { "墨尔本", "MEL" },
            { "悉尼", "SYD" },
            { "伦敦", "LON" },
            { "巴黎", "PAR" },
            { "米兰", "MIL" },
            { "布达佩斯", "BUD" },
            { "伊斯坦布尔", "IST" },
            { "迪拜", "DXB" }
        };

        public Dictionary<string, FlightPrice> flightPrice = new Dictionary<string, FlightPrice>();
        public Dictionary<string, FlightInternationalPrice> flightInternationalPrice = new Dictionary<string, FlightInternationalPrice>();
        public Dictionary<string, DatePrice> datePrices = new Dictionary<string, DatePrice>();
        #region area
        public Dictionary<string, string> cityAirportCodes = new Dictionary<string, string>
        {
            { "北京", "BJS" },
            { "上海", "SHA" },
            { "广州", "CAN" },
            { "深圳", "SZX" },
            { "成都", "CTU" },
            { "杭州", "HGH" },
            { "武汉", "WUH" },
            { "西安", "SIA" },
            { "重庆", "CKG" },
            { "青岛", "TAO" },
            { "长沙", "CSX" },
            { "南京", "NKG" },
            { "厦门", "XMN" },
            { "昆明", "KMG" },
            { "大连", "DLC" },
            { "天津", "TSN" },
            { "郑州", "CGO" },
            { "三亚", "SYX" },
            { "济南", "TNA" },
            { "福州", "FOC" },
            { "阿勒泰", "AAT" },
            { "阿克苏", "AKU" },
            { "鞍山", "AOG" },
            { "安庆", "AQG" },
            { "安顺", "AVA" },
            { "阿拉善左旗", "AXF" },
            { "中国澳门", "MFM" },
            { "阿里", "NGQ" },
            { "阿拉善右旗", "RHT" },
            { "阿尔山", "YIE" },
            { "巴中", "BZX" },
            { "百色", "AEB" },
            { "包头", "BAV" },
            { "毕节", "BFJ" },
            { "北海", "BHY" },
            { "博乐", "BPL" },
            { "保山", "BSD" },
            { "白城", "DBC" },
            { "布尔津", "KJI" },
            { "白山", "NBS" },
            { "巴彦淖尔", "RLK" },
            { "昌都", "BPX" },
            { "承德", "CDE" },
            { "常德", "CGD" },
            { "长春", "CGQ" },
            { "朝阳", "CHG" },
            { "赤峰", "CIF" },
            { "长治", "CIH" },
            { "沧源", "CWJ" },
            { "常州", "CZX" },
            { "池州", "JUH" },
            { "大同", "DAT" },
            { "达州", "DAX" },
            { "稻城", "DCY" },
            { "丹东", "DDG" },
            { "迪庆", "DIG" },
            { "大理", "DLU" },
            { "敦煌", "DNH" },
            { "东营", "DOY" },
            { "大庆", "DQA" },
            { "德令哈", "HXD" },
            { "鄂尔多斯", "DSN" },
            { "额济纳旗", "EJN" },
            { "恩施", "ENH" },
            { "二连浩特", "ERL" },
            { "阜阳", "FUG" },
            { "抚远", "FYJ" },
            { "富蕴", "FYN" },
            { "果洛", "GMQ" },
            { "格尔木", "GOQ" },
            { "广元", "GYS" },
            { "固原", "GYU" },
            { "中国高雄", "KHH" },
            { "赣州", "KOW" },
            { "贵阳", "KWE" },
            { "桂林", "KWL" },
            { "红原", "AHJ" },
            { "海口", "HAK" },
            { "河池", "HCJ" },
            { "邯郸", "HDG" },
            { "黑河", "HEK" },
            { "呼和浩特", "HET" },
            { "合肥", "HFE" },
            { "淮安", "HIA" },
            { "怀化", "HJJ" },
            { "海拉尔", "HLD" },
            { "哈密", "HMI" },
            { "衡阳", "HNY" },
            { "哈尔滨", "HRB" },
            { "和田", "HTN" },
            { "花土沟", "HTT" },
            { "中国花莲", "HUN" },
            { "霍林郭勒", "HUO" },
            { "惠州", "HUZ" },
            { "汉中", "HZG" },
            { "黄山", "TXN" },
            { "呼伦贝尔", "XRQ" },
            { "中国嘉义", "CYI" },
            { "景德镇", "JDZ" },
            { "加格达奇", "JGD" },
            { "嘉峪关", "JGN" },
            { "井冈山", "JGS" },
            { "金昌", "JIC" },
            { "九江", "JIU" },
            { "荆门", "JM1" },
            { "佳木斯", "JMU" },
            { "济宁", "JNG" },
            { "锦州", "JNZ" },
            { "建三江", "JSJ" },
            { "鸡西", "JXA" },
            { "九寨沟", "JZH" },
            { "中国金门", "KNH" },
            { "揭阳", "SWA" },
            { "库车", "KCA" },
            { "康定", "KGT" },
            { "喀什", "KHG" },
            { "凯里", "KJH" },
            { "库尔勒", "KRL" },
            { "克拉玛依", "KRY" },
            { "黎平", "HZH" },
            { "澜沧", "JMJ" },
            { "龙岩", "LCX" },
            { "临汾", "LFQ" },
            { "兰州", "LHW" },
            { "丽江", "LJG" },
            { "荔波", "LLB" },
            { "吕梁", "LLV" },
            { "临沧", "LNJ" },
            { "陇南", "LNL" },
            { "六盘水", "LPF" },
            { "拉萨", "LXA" },
            { "洛阳", "LYA" },
            { "连云港", "LYG" },
            { "临沂", "LYI" },
            { "柳州", "LZH" },
            { "泸州", "LZO" },
            { "林芝", "LZY" },
            { "芒市", "LUM" },
            { "牡丹江", "MDG" },
            { "中国马祖", "MFK" },
            { "绵阳", "MIG" },
            { "梅州", "MXZ" },
            { "中国马公", "MZG" },
            { "满洲里", "NZH" },
            { "漠河", "OHE" },
            { "南昌", "KHN" },
            { "中国南竿", "LZN" },
            { "南充", "NAO" },
            { "宁波", "NGB" },
            { "宁蒗", "NLH" },
            { "南宁", "NNG" },
            { "南阳", "NNY" },
            { "南通", "NTG" },
            { "攀枝花", "PZI" },
            { "普洱", "SYM" },
            { "琼海", "BAR" },
            { "秦皇岛", "BPE" },
            { "祁连", "HBQ" },
            { "且末", "IQM" },
            { "庆阳", "IQN" },
            { "黔江", "JIQ" },
            { "泉州", "JJN" },
            { "衢州", "JUZ" },
            { "齐齐哈尔", "NDG" },
            { "日照", "RIZ" },
            { "日喀则", "RKZ" },
            { "若羌", "RQA" },
            { "神农架", "HPG" },
            { "莎车", "QSZ" },
            { "沈阳", "SHE" },
            { "石河子", "SHF" },
            { "石家庄", "SJW" },
            { "上饶", "SQD" },
            { "三明", "SQJ" },
            { "十堰", "WDS" },
            { "邵阳", "WGN" },
            { "松原", "YSQ" },
            { "台州", "HYN" },
            { "中国台中", "RMQ" },
            { "塔城", "TCG" },
            { "腾冲", "TCZ" },
            { "铜仁", "TEN" },
            { "通辽", "TGO" },
            { "天水", "THQ" },
            { "吐鲁番", "TLQ" },
            { "通化", "TNH" },
            { "中国台南", "TNN" },
            { "中国台北", "TPE" },
            { "中国台东", "TTT" },
            { "唐山", "TVS" },
            { "太原", "TYN" },
            { "五大连池", "DTU" },
            { "乌兰浩特", "HLH" },
            { "乌兰察布", "UCB" },
            { "乌鲁木齐", "URC" },
            { "潍坊", "WEF" },
            { "威海", "WEH" },
            { "文山", "WNH" },
            { "温州", "WNZ" },
            { "乌海", "WUA" },
            { "武夷山", "WUS" },
            { "无锡", "WUX" },
            { "梧州", "WUZ" },
            { "万州", "WXN" },
            { "乌拉特中旗", "WZQ" },
            { "巫山", "WSK" },
            { "兴义", "ACX" },
            { "夏河", "GXH" },
            { "中国香港", "HKG" },
            { "西双版纳", "JHG" },
            { "新源", "NLT" },
            { "忻州", "WUT" },
            { "信阳", "XAI" },
            { "襄阳", "XFN" },
            { "西昌", "XIC" },
            { "锡林浩特", "XIL" },
            { "西宁", "XNN" },
            { "徐州", "XUZ" },
            { "延安", "ENY" },
            { "银川", "INC" },
            { "伊春", "LDS" },
            { "永州", "LLF" },
            { "榆林", "UYN" },
            { "宜宾", "YBP" },
            { "运城", "YCU" },
            { "宜春", "YIC" },
            { "宜昌", "YIH" },
            { "伊宁", "YIN" },
            { "义乌", "YIW" },
            { "营口", "YKH" },
            { "延吉", "YNJ" },
            { "烟台", "YNT" },
            { "盐城", "YNZ" },
            { "扬州", "YTY" },
            { "玉树", "YUS" },
            { "岳阳", "YYA" },
            { "张家界", "DYG" },
            { "舟山", "HSN" },
            { "扎兰屯", "NZL" },
            { "张掖", "YZY" },
            { "昭通", "ZAT" },
            { "湛江", "ZHA" },
            { "中卫", "ZHY" },
            { "张家口", "ZQZ" },
            { "珠海", "ZUH" },
            { "遵义", "ZYI" }
        };
        #endregion

        public void ClearFlightPrice()
        {
            flightPrice.Clear();
            flightInternationalPrice.Clear();
            datePrices.Clear();

        }

        public async Task<string> GetFlightPrice(string srcCityCode, string dstCityCode)
        {
            try
            {
                var request = new RestRequest("/", Method.Get);
                request.AddHeader("Content-Type", "application/json; charset=utf-8");


                var client = new RestClient($@"https://flights.ctrip.com/itinerary/api/12808/lowestPrice?flightWay=Oneway&dcity={srcCityCode}&acity={dstCityCode}&direct=true&army=false");
                RestResponse response;

                response = await client.ExecuteAsync(request);
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {

                    string responseBody = response.Content;
                    // 处理响应内容，例如更新UI
                    if (responseBody.Contains("Success"))
                    {
                        var msg = "GetFlightPrice OK";

                        flightPrice[dstCityCode] = JsonSerializer.Deserialize<FlightPrice>(responseBody);
                        var name = CityAirportCommonCodes.FirstOrDefault(x => x.Value == dstCityCode).Key;
                        DatePrice datePrice = new DatePrice
                        {
                            Name = name,
                            Code = dstCityCode
                        };
                        if (flightPrice[dstCityCode].data.oneWayPrice !=null)
                        {
                            foreach (var item in flightPrice[dstCityCode].data.oneWayPrice.First())
                            {
                                var date = item.Key.Substring(4, 4);
                                var dateColumn = string.Empty;
                                if (date.StartsWith("0"))
                                    dateColumn = $"{date.Substring(1, 3)}";
                                else
                                    dateColumn = date;
                                datePrice.Prices.Add(dateColumn, $"{item.Value}");
                            }
                            datePrices[dstCityCode] = datePrice;
                        }
                        
                        return msg;
                    }
                    else
                    {

                    }

                }
                else
                {
                    var msg = $"请求失败，状态码: {response.StatusCode}";
                    return msg;
                }
            }
            catch (Exception ex)
            {
                var msg = $"请求失败: {ex.Message}";
                return msg;
            }

            return "";
        }


        public async Task<string> GetInternationalFlightPrice(string srcCityCode, string dstCityCode)
        {
            try
            {
                var request = new RestRequest("/", Method.Post);
                request.AddHeader("Content-Type", "application/json; charset=utf-8");
                var payload = JsonSerializer.Serialize(new FlightInternationalPayload
                {
                    departNewCityCode = srcCityCode,
                    arriveNewCityCode = dstCityCode,
                    startDate = DateTime.Now.AddDays(1).ToString("yyyy-mm-dd")
                });
                request.AddBody(payload);


                var client = new RestClient($@"https://flights.ctrip.com/restapi/soa2/15380/bjjson/FlightIntlAndInlandLowestPriceSearch");
                RestResponse response;

                response = await client.ExecuteAsync(request);
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {

                    string responseBody = response.Content;
                    // 处理响应内容，例如更新UI
                    if (responseBody.Contains("Success"))
                    {
                        var msg = "GetFlightPrice OK";

                        flightInternationalPrice[dstCityCode] = JsonSerializer.Deserialize<FlightInternationalPrice>(responseBody);
                        var name = CityAirportForeignCodes.FirstOrDefault(x => x.Value == dstCityCode).Key;
                        DatePrice datePrice = new DatePrice
                        {
                            Name = name,
                            Code = dstCityCode 
                        };
                        foreach (var item in flightInternationalPrice[dstCityCode].priceList)
                        {
                            long milliseconds = long.Parse(item.departDate.Substring(6, 13));

                            // 转换为 DateTime（UTC 时间）
                            DateTime dateTime = DateTime.UnixEpoch.AddMilliseconds(milliseconds);
                            datePrice.Prices.Add(dateTime.AddHours(8).ToString("Mdd"), $"{item.price}");
                        }
                        datePrices[dstCityCode] = datePrice;
                        return msg;
                    }
                    else
                    {

                    }

                }
                else
                {
                    var msg = $"请求失败，状态码: {response.StatusCode}";
                    return msg;
                }
            }
            catch (Exception ex)
            {
                var msg = $"请求失败: {ex.Message}";
                return msg;
            }

            return "";
        }

    }

}
